#include "SerialESP8266wifi.h"
#include "variableDefine.h"
#include "commandFun.h"
#include <WString.h>
////////////////////////////////////////////////////////////////////////////////////////////////////

#define esp8266_reset_pin D2 // 连接8266的CH_PD端口,不是reset(reset端口不连接)
#define SERVER_PORT "2121"   // 服务端口

////////////////////////////////////////////////////////////////////////////////////////////////////
// 8266对象
//SerialESP8266wifi wifi(Serial, Serial, esp8266_reset_pin);
SerialESP8266wifi wifi(Serial, Serial, esp8266_reset_pin, &Serial);

////////////////////////////////////////////////////////////////////////////////////////////////////
// 定义指令
extern command commands[];
extern int command_size;
// 定义操作pin
extern pinState pinlist[];
extern int pin_size;
////////////////////////////////////////////////////////////////////////////////////////////////////
void print(const String& info) {
    Serial.println(info);
}

void setupPin() {
    for(auto i = 0; i < pin_size; i++) {
        pinMode(pinlist[i].pinID, OUTPUT);
    }
}

////////////////////////////////////////////////////////////////////////////////////////////////////

void processCommand(WifiMessage* msg) {
    if (msg == nullptr || msg->message == nullptr || msg->size <= 0) {
        return;
    }
    if (*(msg->message + msg->size - 1) == '\n') {
        msg->size --;
    }
    if (*(msg->message + msg->size - 1) == '\r') {
        msg->size --;
    }
    *(msg->message + msg->size) = 0;
    for(auto i = 0; i < command_size; i++) {
        auto& cmd = commands[i];
        if(cmd.cmd == nullptr || cmd.length > msg->size) {
            continue;
        }
        if(wifi.checkBuffer(msg->message, cmd.cmd, msg->size, cmd.length, false) == false) {
            continue;
        }
        cmd.func(wifi, msg->channel, msg->message);
        return;
    }
    wifi.send(msg->channel, "ERR");
}

////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {

    Serial.begin(115200);   // ESP8266波特率
    while (!Serial) {
        ;
    }
    setupPin();
    variableInit();
    print("Starting wifi");

    wifi.setTransportToTCP();
    //wifi.endSendWithNewline(false);
    wifi.registCall(processCommand);

    while (true) {
        auto state = wifi.begin();
        if (state == 0) {
            auto ssid = selectAP(wifi);
            if(ssid == nullptr) {
                print("no ap find...");
                restart(wifi, 0, nullptr);
                break;
            }
            wifi.connectToAP(ssid, getAPPwd(wifi, ssid));
            wifi.startLocalServer(SERVER_PORT);
            //initfunc(wifi);
            break;
        } else {
            print(String("start failed, state: ") + state);
        }
    }
}

void loop() {
    wifi.checkInput();
}
